package persistence.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

/**
 * Clase Singleton utilitaire de conf Hibernate dans une utilisation par
 * annotations.
 */
public class HibernateUtil
{

    /**
     * Gestionnaire de session hibernate
     */
    private static SessionFactory sessionFactory = buildSessionFactory();
    private static ServiceRegistry serviceRegistry;

    /**
     * Construit la session hibernate
     * 
     * @return
     */
    private static SessionFactory buildSessionFactory()
    {
        try
        {
            // Créé la session en utilisant le fichier hibernate.cfg.xml
            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;
        }
        // En cas d'exception à la création de la session
        catch ( Throwable ex )
        {
            System.err.println( "Création de la session hibernate en ERREUR :" + ex );
            throw new ExceptionInInitializerError( ex );
        }
    }

    /**
     * Accesseur sur l'instance singleton
     * 
     * @return
     */
    public static SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }

    /**
     * Ferme la session Hibernate
     */
    public static void shutdown()
    {
        // Close caches and connection pools
        getSessionFactory().close();
    }

}